Синхронізація ISP-програматора з AVR
Робота ISP-програматора з мікроконтролером AVR починається з активації сигналу скидання мікроконтролера, за якою йде передача по SPI команди входу в режим програмування. На момент активації сигналу RESET на вході SCK обов’язково має бути низький рівень. Якщо ця умова з якоїсь причини не виконується, то спад сигналу SCK вже після встановлення низького рівня на RESET призводить до непередбаченої зміни стану автомату програмування.
Цей зайвий спад спотворює наступну 4-байтову команду входу в програмування, мікроконтролер її не розпізнає і не переходить у потрібний режим. Зсув фази на один період SCK між програматором та мікроконтролером порушує байтову синхронізацію, тому нема сенсу просто передавати команду ще раз. Перед нею теж буде зайвий спад на SCK — під час передачі останнього біту попередньої команди.
Синхронізацію може бути втрачено і під час програмування, про це можна почитати в публікації про повідомлення «synchronisation lost» в AVReAl.
В документації на мікроконтролери AVR різних років розробки описано два способи відновлення синхронізації у випадку, якщо перша команда входу у режим програмування закінчилася невдачею.
У першому способі пересинхронізація здійснюється додатковим імпульсом SCK між чотирибайтовими пакетами команд. Таким чином фаза байт-орієнтованих команд зсувається у бітовому потоці на один біт доти, доки автомат програмування у мікроконтролері не «побачить» правильну команду і не ввійде у режим програмування.
Low-voltage Serial Programming Algorithm
…
3. The serial programming instructions will not work if the communication is out of synchronization. When in sync, the second byte ($53) will echo back when issuing the third byte of the Programming Enable instruction. Whether the echo is correct or not, all four bytes of the instruction must be transmitted. If the $53 did not echo back,give SCK a positive pulse
and issue a new Programming Enable instruction. If the $53 is not seen within 32 attempts, there is no functional device connected.
Цей спосіб описано в документації на AT90S4433, AT90S8515, AT90S8535, ATtiny12, ATtiny15, ATtiny22, ATmega163 та старіші.
Для ATtiny13, ATtiny26, ATmega8, ATmega16, … ATmega128 та новіших рекомендовано другий:
Serial Programming Algorithm
…
3. The Serial Programming instructions will not work if the communication is out of synchronization. When in sync. the second byte (0x53), will echo back when issuing the third byte of the Programming Enable instruction. Whether the echo is correct or not, all four bytes of the instruction must be transmitted. If the 0x53 did not echo back,give RESET a positive pulse
and issue a new Programming Enable command.
Тобто для всіх мікроконтролерів AVR, що зараз випускаються, документація описує спосіб відновлення синхронізації імпульсом на вході RESET, який фактично виконує роль сигналу Chip Select для автомата програмування.
Як слухняний хлопчик, я давно завів в структурах опису моделей відповідні флаги і міняю алгоритм пересинхронізації залежно від заданої в командному рядку моделі контролера.
Але другому способі є одне неприємне місце. Він не є способом досягення синхронізації, це просто повторення спроб увійти в програмування.
Нехай записана раніше програма увімкнула на виводі SCK активний високий рівень, тобто умова «на SCK має бути низький рівень в момент подачі RESET» не виконується. Якщо в першій команді входу в режим програмування синхронізація не відбулася з цієї причини, то за час дії високого рівня на вході RESET під час імпульсу пересинхронізації програма знову може дійти до того місця, де вмикається активний високий на SCK. Вхід в програмування знову не відбудеться.
Щоб зменшити імовірність такої події, AVReAl намагається зробити імпульс на RESET коротким, кілька тактів ядра. Частота тактування для розрахунку довжини імпульсу береться з ключа -o, тому в ньому бажано вказувати значення, близьке до реального.
Існує певна дискретність зміни довжини імпульсу, пов’язана з конкретною апаратурою програматора, можливість зміни частоти тактування в програмі за допомогою регістра CLKPR, …
Імпульс на вході скидання мікроконтролера може і не допомогти. Я вже змирився з цим. Ситуація зустрічається не часто та, як правило, належний вибір частоти в ключі -o допомагає.
Іноді я роблю «перехресний допит» — переглядаю xml-файли опису мікроконтролерів з пакету AVR Studio з метою звірки сигнатур та fuses з документацією. І ось я помітив, що в тих файлах є різні параметри програмування, але ознаки способу синхронізації немає.
При нагоді я перевірив за допомогою осцилографа поведінку фірмових програматорів AVR ISP mkII та AVR Dragon. Виявилося, що обидва програматори для всіх мікроконтролерів використовують лише старий спосіб пересинхронізації імпульсом SCK! Документація від Атмел не має значення для їхніх же програматорів!
«І чого я ото мучився?»
Отже, я вирішив змінити процедуру пересинхронізації в AVReAl.
З наступної версії вона також буде однаковою для всіх моделей, використовуватиметься імпульс на лінії SCK. Простіше і надійніше.
p.s. І все ж в таких розбіжностях між документацією Atmel та її практикою мало приємного.